#pragma once
#include <arpa/inet.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<sys/epoll.h>
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<strings.h>
#include<sys/stat.h>
#include<assert.h>
#include<sys/sendfile.h>
#include <netinet/in.h>  
#include<unistd.h>
#include <dirent.h>
#include <stdlib.h>
#include<sys/time.h>
#include<signal.h>
#include <ctype.h>
#include <pthread.h>

void ignore_sigpipe();
int initListenFd(unsigned short port);

int epollrun(int lfd);

// int acceptClient(int lfd,int epfd);
// 改成能够用线程处理的版本 ,其实传的参数是一样的 ，因为在创建线程的时候会
void* acceptClient(void * arg);

int setnonblock(int fd);

// int recvHttpRequest(int cfd,int epfd);

void* recvHttpRequest(void * arg);

int parseHttpRequest(const char* line,int cfd);

int sendfile(const char* filename,int cfd);


// 发送响应头
int sendHeadMsg(int cfd,int status,const char*descr,const char* type, int length);


// 通过文件后缀返回content-type
const char* getFileType(const char* filename);

//发送目录
int sendDir(const char* dir,int cfd);

int hexToDec(char c);

void decodeMsg(char* to, const char* from);